package repositorio;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import model.Aluno;
import model.DiaDaSemana;
import model.Disciplina;
import model.Professor;
import model.Turma;

public class InitDataSource {

	AlunoRepositorio alunoRepo = new AlunoRepositorio();
	DisciplinaRepositorio disciplinaRepo = new DisciplinaRepositorio();
	ProfessorRepositorio professorRepo = new ProfessorRepositorio();
	TurmaRepositorio turmaRepo = new TurmaRepositorio();

	public void criarBase() throws IOException {

		String rootPath = System.getProperty("user.dir");
		File sqlFile = new File(rootPath + "/base/mydatabase.sql");

		if (!sqlFile.exists()) {
			System.out.println("Arquivo para criação do BD não encontrado!");
			return;
		}

		BufferedReader br = new BufferedReader(new FileReader(sqlFile));

		String linha = "";

		Connection con = null;
		PreparedStatement ps = null;

		while ((linha = br.readLine()) != null) {

			String sql = "";
			do {
				sql += linha + "\n";

			} while (!"-- FIM COMANDO".equals(linha = br.readLine()));

			con = ConnectionFactory.getConnection();

			try {
				ps = con.prepareStatement(sql);
				ps.execute();
			} catch (SQLException se) {
				System.err.println(se.getMessage());
				BDUtil.finalizeConnection(ps, con);
			}

		}

	}

	public void importarBase() throws FileNotFoundException {

		String rootPath = System.getProperty("user.dir");
		File importFile = new File(rootPath + "/base/dados.txt");

		if (!importFile.exists()) {
			System.err.println("Arquivo importação não existe!");
			return;
		}

		BufferedReader br = new BufferedReader(new FileReader(importFile));

		String linha = "";

		Connection con = null;
		PreparedStatement ps = null;
		try {

			while ((linha = br.readLine()) != null) {

				if (linha.startsWith("aluno:")) {

					alunoRepo = new AlunoRepositorio();

					if (alunoRepo.incluir(parseAluno(linha)))
						System.out.println("Aluno Incluido");

					else
						System.out.println("Aluno NAO Incluido");

				} else if (linha.startsWith("disciplina:")) {

					disciplinaRepo = new DisciplinaRepositorio();

					if (disciplinaRepo.incluir(parseDisciplina(linha)))
						System.out.println("Disciplina Incluido");

					else
						System.out.println("Disciplina NAO Incluido");

				} else if (linha.startsWith("professor:")) {

					professorRepo = new ProfessorRepositorio();

					if (professorRepo.incluir(parseProfessor(linha)))
						System.out.println("Professor Incluido");

					else
						System.out.println("Professor NAO Incluido");

				} else if (linha.startsWith("turma:")) {

					turmaRepo = new TurmaRepositorio();

					if (turmaRepo.incluir(parseTurma(linha)))
						System.out.println("Turma Incluida");

					else
						System.out.println("Turma NAO Incluido");

				}

			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			BDUtil.finalizeConnection(ps, con);
		}

	}

	public Aluno parseAluno(String registro) {

		String[] coluna = registro.split(":");

		Aluno a = new Aluno();
		a.setNome(coluna[1]);
		a.setNrMatricula(Integer.parseInt(coluna[2]));

		return a;
	}

	public Professor parseProfessor(String registro) {

		String[] coluna = registro.split(":");

		Professor p = new Professor();
		p.setNome(coluna[1]);
		p.setNrMatricula(Integer.parseInt(coluna[2]));
		p.setTitulacao("");
		return p;
	}

	public Disciplina parseDisciplina(String registro) {

		String[] coluna = registro.split(":");

		Disciplina d = new Disciplina();
		d.setNome(coluna[1]);
		d.setNrCreditos(Integer.parseInt(coluna[2]));
		d.setSemestre(Integer.parseInt(coluna[3]));

		return d;
	}

	public Turma parseTurma(String registro) {

		String[] coluna = registro.split(":");

		Turma t = new Turma();
		int diaSemana = Integer.parseInt(coluna[3]);
		int sala = Integer.parseInt(coluna[4]);
		t.setCdTurma(diaSemana + "_" + sala);
		t.setProfessor(new Professor(Integer.parseInt(coluna[1]), "", ""));
		t.setDisciplina(new Disciplina(coluna[2], 0, 0));
		t.setDiaDaSemana(DiaDaSemana.values()[diaSemana]);
		t.setSala(sala);

		for (int i = 5; i < coluna.length; i++) {

			int matriculaAluno = Integer.parseInt(coluna[i]);

			if (alunoRepo.exists(matriculaAluno)) 
			{
				if (alunoRepo.matricular(matriculaAluno, t.getCdTurma()))
				{
					System.out.println("Aluno MATRICULADO com SUCESSO");
				}
				else
					System.err.println("Aluno NAO MATRICULADO");
				
			} else 
				System.err.println("Aluno NAO ESTA NA BASE");
			
			
			

		}

		return t;
	}

}
